﻿
namespace FastFood.Windows.Forms.Procesos
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    using FastFood.Business.Entities;
    using FastFood.Business.Logic;
    using FastFood.Windows.Helpers;
    using System.Data.Linq;
    using System.Drawing;

    public partial class CwfDetallesCompras : UserControl
    {
        CwfDetCompraBusqueda detCompraBusqueda;
        CwfCompras _cwfCompras;

        public CwfCompras miCwfCompras
        {
            set { _cwfCompras = value; }
        }
        public List<DetallesCompras> ListaDetalle { get; set; }
        public EstadoActual estadoActual;
        
        public CwfDetallesCompras()
        {
            InitializeComponent();
        }

        private void CwfDetalle_Load(object sender, EventArgs e)
        {
            if (!DesignMode)
            {
                ClearControls();
                InitialLoad();
                EnabledControls(true);
                EnabledButtons(true);

                detCompraBusqueda = new CwfDetCompraBusqueda();
                detCompraBusqueda.CwfInsumoBusqueda_SeleccionEntidad += new GetObjeto(insumosBusqueda_CwfInsumoBusqueda_SeleccionEntidad);
                detCompraBusqueda.BorderStyle = BorderStyle.None;
                insumoCmb.DropDownControl = detCompraBusqueda;
            }
        }

        private void Focus_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(Keys.Enter))
            {
                e.Handled = true;
                SendKeys.Send("{TAB}");
            }
        }

        private void TsbNuevo_Click(object sender, EventArgs e)
        {
            this.estadoActual = EstadoActual.Nuevo;
            EnabledControls(false);
            EnabledButtons(false);
            ClearControls();
            
            this.insumoCmb.Focus();
            //this.detCompraBindingSource.AddNew();
        }

        private void TsbEditar_Click(object sender, EventArgs e)
        {
            this.estadoActual = EstadoActual.Editar;
            EnabledControls(false);
            EnabledButtons(false);
            this.insumoCmb.Focus();
        }

        private void TsbEliminar_Click(object sender, EventArgs e)
        {
            bool bloqueado = false;
            List<CantidadesAlmacenamientos> coleccion =
                (List<CantidadesAlmacenamientos>)cantidadesAlmacenamientosBindingSource.DataSource;
            foreach (CantidadesAlmacenamientos item in coleccion)
            {
                if (item.bloqueado)
                {
                    bloqueado = true;
                    break;
                }
            }

            if (bloqueado)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, "Este detalle no se puede eliminar, por contener combinaciones de lotes y almacenes que ya no existen");
            }
            else if (Mensaje.ShowMessageConfirm(this.ParentForm, Constantes.Titulo, "¿Desea eliminar el Registro?") == DialogResult.Yes)
            {
                this.estadoActual = EstadoActual.Eliminar;
                SaveData();
                this.estadoActual = EstadoActual.Normal;
                if (this.detCompraBindingSource.Current != null)
                {
                    LoadDetalle(this.detCompraBindingSource.Current as DetallesCompras);
                }
            }
        }

        private void TsbGuardar_Click(object sender, EventArgs e)
        {
            if (ValidateData())
            {
                if (SaveData())
                {
                    this.estadoActual = EstadoActual.Normal;
                    if (this.detCompraBindingSource.Current != null)
                    {
                        LoadDetalle(this.detCompraBindingSource.Current as DetallesCompras);
                    }

                    EnabledControls(true);
                    EnabledButtons(true);
                    this.detallesComprasDataGridView.Focus();
                }
            }
        }

        private void TsbCancelar_Click(object sender, EventArgs e)
        {
            if (this.estadoActual == EstadoActual.Nuevo || this.estadoActual == EstadoActual.Editar)
            {
                ClearControls();
            }
            this.estadoActual = EstadoActual.Normal;
            EnabledControls(true);
            EnabledButtons(true);
            this.detCompraBindingSource.CancelEdit();
            this.detallesComprasDataGridView.Focus();
        }
         
        private void insumosDataGridView_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1 && e.ColumnIndex != -1)
            {
                if (this.estadoActual == EstadoActual.Normal)
                    LoadDetalle(this.detCompraBindingSource.Current as DetallesCompras);
            }
        }

        private void detalleDataGridView_KeyDown(object sender, KeyEventArgs e)
        {
            if (this.estadoActual != EstadoActual.Normal) return;
            if (e.KeyCode == Keys.Delete)
            {
                if (this.detallesComprasDataGridView.SelectedRows.Count != 0)
                {
                    if (Mensaje.ShowMessageConfirm(this.ParentForm, Constantes.Titulo, "¿Desea eliminar el Registro?") == DialogResult.No)
                    {
                        e.Handled = true;
                    }
                    else
                    {
                        this.estadoActual = EstadoActual.Eliminar;
                        SaveData();
                        this.estadoActual = EstadoActual.Normal;
                        if (this.detCompraBindingSource.Current != null)
                        {
                            LoadDetalle(this.detCompraBindingSource.Current as DetallesCompras);
                        }
                    }
                }
            }
        }

        public void InitialLoad()
        {
            try
            {
                if (ListaDetalle == null) ListaDetalle = new List<DetallesCompras>();
                detCompraBindingSource.DataSource = new List<DetallesCompras>(ListaDetalle);
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
        }

        public void LoadLotes()
        {
            short insumoID = Convert.ToInt16(insumoIDLabel.Text);
            if (insumoID > 0)
            {
                try
                {
                    cmbLotes.DataSource = new LotesManager().ListarByInsumoID(insumoID);
                    cmbLotes.DisplayMember = "Resumen";
                    cmbLotes.ValueMember = "loteID";
                }
                catch (Exception ex)
                {
                    Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
                }
            }
        }

        public void LoadAlmacenamientos()
        {
            int loteID = 0;
            if(cmbLotes.SelectedValue != null) Int32.TryParse(cmbLotes.SelectedValue.ToString(), out loteID);

            if (loteID > 0)
            {
                try
                {
                    cantidadesAlmacenamientosBindingSource.DataSource = new CantidadesAlmacenamientosManager().ListarByLoteID(loteID);
                }
                catch (Exception ex)
                {
                    Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
                }
            }
            else
            {
                cantidadesAlmacenamientosBindingSource.DataSource = new List<CantidadesAlmacenamientos>();
            }
        }

        public bool LoadAlmacenes(IList<DetCompraAlmacenamiento> coleccion)
        {
            try
            {
                foreach (DetCompraAlmacenamiento item in coleccion)
                {
                    if (item.Almacenes == null) item.Almacenes = new AlmacenesManager().Obtener(item.almacenID);
                }
            }
            catch (Exception)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, "Ocurrio un error al tratar de cargar datos del Almacen. Intente de nuevo");
                return false;
            }
            return true;
        }

        private void LoadDetalle(DetallesCompras detalle)
        {
            this.insumoIDLabel.Text = detalle.insumoID.ToString();
            this.insumoCmb.Text = detalle.nombreInsumo;
            LoadLotes();
            this.cmbLotes.SelectedValue = detalle.loteID;
            this.insumoIDLabel.Text = detalle.insumoID.ToString();
            this.precioTextBox.Text = detalle.precioUnitario.ToString();
            this.cantidadTextBox.Text = detalle.cantidad.ToString();
            this.compraIDLabel.Text = detalle.compraID.ToString();
            //this.txtNombreInsumo.Text = detalle.Insumos.nombre;

            List<CantidadesAlmacenamientos> coleccion =
                (List<CantidadesAlmacenamientos>)cantidadesAlmacenamientosBindingSource.DataSource;
            
            if (LoadAlmacenes(detalle.DetCompraAlmacenamiento))
            {
                foreach (DetCompraAlmacenamiento detAlmacenamiento in detalle.DetCompraAlmacenamiento)
                {
                    bool aparece = false;
                    foreach (CantidadesAlmacenamientos item in coleccion)
                    {
                        if (item.Almacen.almacenID == detAlmacenamiento.almacenID)
                        {
                            aparece = item.almacenar = true;
                            item.cantidad = detAlmacenamiento.cantidad;
                            break;
                        }
                    }
                    if (!aparece)
                    {
                        coleccion.Add(new CantidadesAlmacenamientos()
                        {
                            bloqueado = true,
                            almacenar = true,
                            cantidad = detAlmacenamiento.cantidad,
                            Almacen = detAlmacenamiento.Almacenes
                        });
                    }
                }
                cantidadesAlmacenamientosBindingSource.ResetBindings(false);
                pintarBloqueados();
            }
        }

        private void pintarBloqueados()
        {
            int i = 0;
            List<CantidadesAlmacenamientos> coleccion =
                (List<CantidadesAlmacenamientos>)cantidadesAlmacenamientosBindingSource.DataSource;
            foreach (CantidadesAlmacenamientos item in coleccion)
            {
                if (item.bloqueado)
                {
                    cantidadesAlmacenamientosDataGridView.Rows[i].Cells[0].Style.BackColor = 
                    cantidadesAlmacenamientosDataGridView.Rows[i].Cells[1].Style.BackColor =
                    cantidadesAlmacenamientosDataGridView.Rows[i].Cells[2].Style.BackColor = Color.Red;
                }
                i++;
            }
        }

        private bool SaveData()
        {
            bool result = false;
            try
            {
                switch (this.estadoActual)
                {
                    case EstadoActual.Nuevo:
                        ListaDetalle.Add(GetDetalle());
                        break;
                    case EstadoActual.Editar:
                        int index = 0;
                        DetallesCompras detalle = this.detCompraBindingSource.Current as DetallesCompras;
                        foreach (DetallesCompras item in ListaDetalle)
                        {
                            if (item.loteID.Equals(detalle.loteID))
                            {
                                ListaDetalle[index] = GetDetalle();
                                break;
                            }
                            index++;
                        }
                        break;
                    case EstadoActual.Eliminar:
                        ListaDetalle.Remove(this.detCompraBindingSource.Current as DetallesCompras);
                        this.detCompraBindingSource.RemoveCurrent();
                        break;
                }

                this.detCompraBindingSource.EndEdit();
                _cwfCompras.costo = getPrecioTotal();
                result = true;
                InitialLoad();
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
            return result;
        }

        private decimal getPrecioTotal()
        {
            decimal precio = 0;
            foreach (DetallesCompras detalle in ListaDetalle)
            {
                precio += detalle.precioTotal;
            }
            return precio;
        }

        private DetallesCompras GetDetalle()
        {
            DetallesCompras detalle = new DetallesCompras
            {
                compraID = Convert.ToInt16(compraIDLabel.Text),
                loteID = Convert.ToInt16(cmbLotes.SelectedValue),
                Lotes = (Lotes)cmbLotes.SelectedItem,
                insumoID = Convert.ToInt16(insumoIDLabel.Text),
                precioUnitario = Convert.ToDecimal(precioTextBox.Text),
                nombreInsumo = insumoCmb.Text,
                Lote_Resumen = cmbLotes.Text,
                DetCompraAlmacenamiento = new EntitySet<DetCompraAlmacenamiento>()
            };
            List<CantidadesAlmacenamientos> coleccion =
                (List<CantidadesAlmacenamientos>)cantidadesAlmacenamientosBindingSource.DataSource;

            foreach (CantidadesAlmacenamientos item in coleccion)
            {
                if (item.cantidad > 0)
                {
                    detalle.DetCompraAlmacenamiento.Add(new DetCompraAlmacenamiento()
                    {
                        loteID = detalle.loteID,
                        almacenID = item.Almacen.almacenID,
                        cantidad = item.cantidad
                    });
                }
            }
            return detalle;
        }

        private bool ValidateData()
        {
            bool result = true;

            if (this.insumoIDLabel.Text=="-1")
            {
                this.errValidator.SetError(this.insumoCmb, "Seleccionar Insumo.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.insumoCmb, string.Empty);
            }

            if (this.cmbLotes.SelectedIndex == -1)
            {
                this.errValidator.SetError(this.cmbLotes, "Seleccionar Lote.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.cmbLotes, string.Empty);
            }

            if (string.IsNullOrEmpty(precioTextBox.Text))
            {
                this.errValidator.SetError(this.precioTextBox, "Ingresar Precio.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.precioTextBox, string.Empty);
            }

            double cantidad = Convert.ToDouble(this.cantidadTextBox.Text);
            if (cantidad == 0)
            {
                this.errValidator.SetError(this.cantidadTextBox, "Ingresar Cantidades.");
                result = false;
            }
            else
            {
                bool validos = true;
                List<CantidadesAlmacenamientos> coleccion =
                (List<CantidadesAlmacenamientos>)cantidadesAlmacenamientosBindingSource.DataSource;

                foreach (CantidadesAlmacenamientos item in coleccion)
                {
                    if (item.almacenar && item.cantidad == 0)
                    {
                        this.errValidator.SetError(this.cantidadTextBox, "Ingresar cantidad mayor a 0 en almacenes seleccionados.");
                        result = validos = false;
                        break;
                    }
                }

                if(validos) this.errValidator.SetError(this.cantidadTextBox, string.Empty);
            }

            int act = detallesComprasDataGridView.CurrentRow.Index;
            for(int i=0; i< ListaDetalle.Count; i++)
            {
                if (ListaDetalle[i].loteID == Convert.ToInt32(cmbLotes.SelectedValue))
                {
                    if (i != act)
                    {
                        this.errValidator.SetError(this.cmbLotes, "Este lote ya a sido asignado.");
                        result = false;
                        break;
                    }
                }
            }

            return result;
        }

        private void EnabledControls(bool valor)
        {
            this.groupBox1.Enabled = !valor;
            this.detallesComprasDataGridView.Enabled = valor;
        }

        private void EnabledButtons(bool valor)
        {
            this.TsbNuevo.Enabled = valor;
            this.TsbEditar.Enabled = valor;
            this.TsbEliminar.Enabled = valor;

            if (this.estadoActual == EstadoActual.Nuevo ||
                this.estadoActual == EstadoActual.Editar)
            {
                this.TsbGuardar.Enabled = true;
                this.TsbCancelar.Enabled = true;
                this.detallesComprasDataGridView.Enabled = false;
            }
            else
            {
                this.TsbGuardar.Enabled = false;
                this.TsbCancelar.Enabled = false;
                this.detallesComprasDataGridView.Enabled = true;
            }
        }

        public void ClearControls()
        {
            compraIDLabel.Text = "-1";
            //insumosBusqueda.limpiar();
            cmbLotes.SelectedIndex = -1;
            insumoCmb.Text = "[Seleccionar un insumo]";
            precioTextBox.Text = string.Empty;
            cantidadTextBox.Text = "0";
            insumoIDLabel.Text = "-1";
            errValidator.Clear();
        }

        private void insumoCmb_DropDown(object sender, EventArgs e)
        {
            detCompraBusqueda.limpiar();
            insumoCmb.Text = "[Seleccionar un insumo]";
        }

        private void insumoCmb_DropDownClosed(object sender, EventArgs e)
        {

        }

        public void insumosBusqueda_CwfInsumoBusqueda_SeleccionEntidad(object objeto)
        {
            Insumos insumo = (Insumos)objeto;
            insumoCmb.Text = insumo.nombre;
            insumoIDLabel.Text = insumo.insumoID.ToString();
            cantidadTextBox.Focus();
            insumoCmb.HideDropDown();           
        }

        private void insumoCmb_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Down)
            {
                insumoCmb.ShowDropDown();
            }
            else
                e.SuppressKeyPress = true;
        }

        public void MenuSoloConImagenes(bool estado)
        {
            this.TsMenu.SuspendLayout();
            if (estado)
            {
                TsbNuevo.DisplayStyle = ToolStripItemDisplayStyle.Image;
                TsbEditar.DisplayStyle = ToolStripItemDisplayStyle.Image;
                TsbCancelar.DisplayStyle = ToolStripItemDisplayStyle.Image;
                TsbGuardar.DisplayStyle = ToolStripItemDisplayStyle.Image;
                TsbEliminar.DisplayStyle = ToolStripItemDisplayStyle.Image;
            }
            else
            {
                TsbNuevo.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
                TsbEditar.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
                TsbCancelar.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
                TsbGuardar.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
                TsbEliminar.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
            }
            this.TsMenu.ResumeLayout();
        }

        private void cmbLotes_DropDown(object sender, EventArgs e)
        {
            int actual = Convert.ToInt32(cmbLotes.SelectedValue);
            LoadLotes();
            cmbLotes.SelectedValue = actual;
        }

        private void cmbLotes_SelectedIndexChanged(object sender, EventArgs e)
        {
            LoadAlmacenamientos();
        }

        private void cantidadesAlmacenamientosDataGridView_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
        {
            bool bloqueado = Convert.ToBoolean(cantidadesAlmacenamientosDataGridView.Rows[e.RowIndex].Cells[3].Value);

            if (bloqueado)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, "Este almacen ya no guarda este lote. No se puede modificar detalle");
                e.Cancel = true;
            }
            else
            {
                bool almacenar = Convert.ToBoolean(cantidadesAlmacenamientosDataGridView.Rows[e.RowIndex].Cells[0].Value);
                if (e.ColumnIndex == 2)
                {
                    if (!almacenar) e.Cancel = true;
                }
            }
        }

        private void cantidadesAlmacenamientosDataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            double total = 0;
            List<CantidadesAlmacenamientos> coleccion =
                (List<CantidadesAlmacenamientos>)cantidadesAlmacenamientosBindingSource.DataSource;

            foreach (CantidadesAlmacenamientos item in coleccion)
            {
                total += item.cantidad;
            }
            this.cantidadTextBox.Text = total.ToString();
        }

        private void cantidadesAlmacenamientosDataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {          
            e.Cancel = true;
        }        
    }
}
